{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "6e0d2213-59fa-4632-811a-f065581ee932",
   "metadata": {},
   "source": [
    "## 代码练习：利用简单多层感知机简单线性回归"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c423d212-d147-4b71-8a19-7a94683c86fb",
   "metadata": {},
   "source": [
    "### 参考"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "50348b42-2bed-42ec-b183-a680868eec82",
   "metadata": {},
   "source": [
    "#### 参考：载入并自动分割TensorFlow手写数字数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "2ff12d12-221f-49c9-a1ff-d21e691b66cc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(60000, 28, 28)\n",
      "(10000, 28, 28)\n"
     ]
    },
    {
     "data": {
      "image/png": "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uG/fvmW+DWTG7NmzbRzezgHpc8UVV3jH7uftHTt2eGPue6GrrrrKxj/++KN33qOPPmrjM844w8ZuGZTklzKGS8Vr1Khh46+++srG7vOB5L/PigoragAAAAAAAGKCiRoAAAAAAICYYKIGAAAAAAAgJvJ2j5owt/Zt4sSJ3pjbIsxtXxmuE3Zr195666205pcvwrXsq1evztp9u/vSDBw40MYDBgzwznPbPru1jpK0adOmDGUXjQcffDDqFMrk7LPPLvH7qbaMRmqaNWtm43PPPTelnwnvg/LZZ5+lMyUUmzdvno3D7bnLw30dc+u5JX+fDPaBqphwC253v5nwa5DLbcU7cuRIb8x93+L+LsyYMcM77/jjj7dxuLX2Qw89ZGN3/5pwK9PnnnvOxv/+97+9Mfd1JLxfgGvhwoVJx+Bfb+E9E1zh1umNGjWy8eLFi9OfWAFz9/EbMmRIWm87vD8ie9TEh7snV5j7XF6rVi1vzP19we65+75K/r/7fffd5425+9eUxr2ORo0aZeMWLVqknJe7f427X1Ec9qQJY0UNAAAAAABATDBRAwAAAAAAEBN5W/rUpEkT7/j3v/+9jZs3b+6NueVOrvAS07lz56Ypu/z10ksvZe2+3PINyV9e7raEC5dsXHbZZRnNC+k3derUqFPIK2+88YaNDzzwwKTnuS3Xe/TokcmUkCGVK1e2cbglsFt+QXvusttzzz1tfO+993pj/fv3t/HmzZu9sdtvv93G7r97uFW7227UbdF8wgkneOctXbrUxjfeeKM35i7rLioqsnHLli29866++mobt2/f3hubOXOmSuK2NZWk2rVrl3geEp566ikbh0sCStOrVy8b33LLLelMCRl03nnnRZ0Ckti5c2fSMbcsxt1SAWUX/vz14osv2jj8+pEqt7W2W84bduWVV9p40aJFSc9zt8OII1bUAAAAAAAAxAQTNQAAAAAAADGR86VPDRo0sHGfPn1sHN41/9BDD03p9n755RcbhzsWhZeNFyp3WWD4uEOHDt7YzTffnNb7vvXWW2181113eWMHHHCAjd0OFt26dUtrDkCuq169uo1Le1574oknbJxvHdEKxeuvvx51CnnLLUlxS50kacuWLTYOl7m4pYennXaajXv27Omdd8EFF9jYLWH761//6p3ndssobTn5hg0bbPzaa695Y+6xu2Rckq666qoS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\n",
      "text/plain": [
       "<Figure size 1440x216 with 10 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from tensorflow.keras.datasets import mnist\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "(X_train,y_train),(X_test,y_test) = mnist.load_data() # 加载数据集\n",
    "print(X_train.shape) # (60000, 28, 28) 60000张图片，每张图片是28*28的像素\n",
    "print(X_test.shape) # (10000, 28, 28) 10000张图片，每张图片是28*28的像素\n",
    "\n",
    "plt.figure(figsize=(20,3))\n",
    "for i in range(10):\n",
    "    plt.subplot(1,10,i+1)\n",
    "    plt.imshow(X_train[i],cmap='gray')\n",
    "    plt.title(y_train[i],fontsize=20)\n",
    "    plt.axis('off')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "58e855c1-33c7-40a6-ba6c-a6581ea807d5",
   "metadata": {},
   "source": [
    "#### 参考：多层感知机拟合手写数字数据集 完整代码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "f1b68979-365e-4281-b33d-aaf2e8380a66",
   "metadata": {},
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "from tensorflow.keras.datasets import mnist\n",
    "from tensorflow.keras.layers import Flatten, Dense\n",
    "from tensorflow.keras.models import Sequential\n",
    "from tensorflow.keras.utils import to_categorical\n",
    "import numpy as np\n",
    "from tabulate import tabulate\n",
    "import matplotlib.pyplot as plt\n",
    "from tensorflow.keras.utils import plot_model\n",
    "\n",
    "# 1. 引入数据\n",
    "(X_train,y_train),(X_test,y_test) = mnist.load_data()\n",
    "\n",
    "# 降样本数据归一化，如果没有这一个步骤，模型准确率有时直接下降约 10%\n",
    "X_train = X_train/255.0\n",
    "X_test = X_test/255.0\n",
    "# 将标签数据转换为one-hot编码\n",
    "y_train = to_categorical(y_train)\n",
    "y_test = to_categorical(y_test)\n",
    "\n",
    "# 2. 构建网络模型\n",
    "model = tf.keras.models.Sequential() # 序贯模型\n",
    "\n",
    "# 2.1 输入层:\n",
    "# 添加一个输入层, 该层把输入的数据展平，即把二维的图片数据展平为一维的向量\n",
    "# 也可以通过以下代码在之前就把数据展平，这样就不需要在这里展平了\n",
    "# X_train = X_train.reshape(-1,28*28)\n",
    "# X_test = X_test.reshape(-1,28*28)\n",
    "model.add(Flatten(input_shape=(28,28))) \n",
    "\n",
    "# 2.2 隐藏层:\n",
    "# 全连接层，20个神经元\n",
    "# 激活函数是 relu, 也就是 max(0,x), x<0时，输出0，x>0时，输出x, 即将负数变成0，正数不变\n",
    "# 这个函数可以避免负数的影响, 使得神经网络的训练更加稳定, 也可以加快训练速度, 但是也会丢失一些信息\n",
    "# 一般情况下分类问题我们会经常使用relu作为隐藏层的激活函数\n",
    "model.add(Dense(20,activation=tf.nn.relu)) \n",
    "\n",
    "# 2.3 输出层:\n",
    "# 全连接层，10个神经元\n",
    "# 激活函数是 softmax, \n",
    "# 它将输出的结果转换成概率分布, 使得输出的结果的和为1 , \n",
    "# 例如，对于包含四个分类的内容，其输出的结果可能是 [0.1, 0.2, 0.3, 0.4], 其和为1\n",
    "# 也就是说，这个神经网络认为这个图片是第4类的概率是最大的，是0.4\n",
    "# 一般情况下分类问题我们会经常使用softmax作为输出层的激活函数\n",
    "model.add(Dense(10,activation=tf.nn.softmax))\n",
    "\n",
    "# 3. 编译模型\n",
    "model.compile(optimizer='adam', # 学习率的自动调整的梯度下降\n",
    "              loss='categorical_crossentropy', # 损失函数, 分类问题一般使用交叉熵, 回归问题一般使用均方误差\n",
    "              metrics=['accuracy'])  # loss和val_loss是训练集和验证集的损失函数，acc和val_acc是训练集和验证集的准确率\n",
    "\n",
    "# 4. 训练模型\n",
    "model.fit(X_train, y_train, epochs=20, validation_data=(X_test, y_test))\n",
    "\n",
    "# 5. 评估模型\n",
    "test_loss, test_acc = model.evaluate(X_test, y_test)\n",
    "print('Test accuracy:', test_acc)\n",
    "\n",
    "# 6. 预测\n",
    "n = X_test[0]\n",
    "prediction = model.predict([n.reshape(1,28,28)])\n",
    "# print(\"直接预测结果predction: \",prediction)\n",
    "# print(\"美化后的结果(提示: 找那个没有e-xx的)predction:\")\n",
    "# print(tabulate([prediction[0]], headers=['0','1','2','3','4','5','6','7','8','9'], tablefmt='grid'))\n",
    "\n",
    "plt.imshow(X_test[0],cmap='gray')\n",
    "plt.title(\"np.argmax(prediction): \"+str(np.argmax(prediction)))\n",
    "plt.show()\n",
    "\n",
    "# 7. 打印模型结构\n",
    "model.summary()\n",
    "plot_model(model, to_file='model.png', show_shapes=True)\n",
    "plt.imshow(plt.imread('model.png'))\n",
    "plt.show()\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2b9b53ae-ecdf-4303-86e8-8865d7816eab",
   "metadata": {},
   "source": [
    "#### 参考：感知机实现简单线性回归分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "f48fd9f5-e053-4be5-8e10-baa583b77709",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[18.983328]]\n"
     ]
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "from tensorflow.keras import Sequential\n",
    "from tensorflow.keras.layers import Dense\n",
    "\n",
    "\n",
    "# 1. 明确数据\n",
    "X = tf.constant([-1.0,  0.0, 1.0, 2.0, 3.0, 4.0])\n",
    "y = tf.constant([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0])\n",
    "\n",
    "# 2. 创建一个序贯模型\n",
    "model = Sequential() \n",
    "\n",
    "# 3. 在模型中添加一个全连接Dense层\n",
    "hidden_layer_1 = Dense(units=1, input_shape=(1,))\n",
    "model.add(hidden_layer_1)\n",
    "# 或者直接写成 model.add(Dense(units=1, input_shape=(1,)))\n",
    "\n",
    "# 4. 使用\"随机梯度下降\"作为优化方法, \"均方误差\"作为损失函数编译模型\n",
    "model.compile(optimizer='sgd', loss='mean_squared_error')\n",
    "# 5. 用模型去拟合 X 和 y ,用梯度下降优化模型的循环要做500个回合\n",
    "model.fit(X, y, epochs=500,verbose=0)\n",
    "\n",
    "# 6. 用训练好的模型去预测y\n",
    "print(model.predict([10.0]))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "37aea000-8bb9-47f8-a945-f15ee77ab9cc",
   "metadata": {},
   "source": [
    "#### 参考：用文字和图像打印感知机结构和总结信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "f41d79f7-e671-41fb-96fd-64a44ed50a6f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_1\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "dense_1 (Dense)              (None, 1)                 2         \n",
      "=================================================================\n",
      "Total params: 2\n",
      "Trainable params: 2\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n",
      "('You must install pydot (`pip install pydot`) and install graphviz (see instructions at https://graphviz.gitlab.io/download/) ', 'for plot_model/model_to_dot to work.')\n"
     ]
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "from tensorflow.keras import Sequential\n",
    "from tensorflow.keras.layers import Dense\n",
    "\n",
    "\n",
    "# 1. 明确数据\n",
    "X = tf.constant([-1.0,  0.0, 1.0, 2.0, 3.0, 4.0])\n",
    "y = tf.constant([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0])\n",
    "\n",
    "# 2. 创建一个序贯模型\n",
    "model = Sequential() \n",
    "\n",
    "# 3. 在模型中添加一个全连接Dense层\n",
    "hidden_layer_1 = Dense(units=1, input_shape=(1,))\n",
    "model.add(hidden_layer_1)\n",
    "# 或者直接写成 model.add(Dense(units=1, input_shape=(1,)))\n",
    "\n",
    "# 4. 打印模型的结构(文字版)\n",
    "model.summary()\n",
    "\n",
    "# 5. 打印模型的结构(图形版)\n",
    "from tensorflow.keras.utils import plot_model\n",
    "plot_model(model, to_file='model.png', show_shapes=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8df472f2-4a3d-4d90-ac8c-87c4da041452",
   "metadata": {},
   "source": [
    "#### 参考：用曲线图回顾感知机训练过程的loss的变化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "2425494d-8519-4a3e-9b69-cdd80d5facf0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "history 对象类型: <class 'keras.callbacks.History'>\n",
      "history_dict 中包含所有的键:  dict_keys(['loss'])\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "from tensorflow.keras import Sequential\n",
    "from tensorflow.keras.layers import Dense\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "\n",
    "# 1. 明确数据\n",
    "X = tf.constant([-1.0,  0.0, 1.0, 2.0, 3.0, 4.0])\n",
    "y = tf.constant([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0])\n",
    "\n",
    "# 2. 创建一个序贯模型\n",
    "model = Sequential() \n",
    "\n",
    "# 3. 在模型中添加一个全连接Dense层\n",
    "hidden_layer_1 = Dense(units=1, input_shape=(1,))\n",
    "model.add(hidden_layer_1)\n",
    "# 或者直接写成 model.add(Dense(units=1, input_shape=(1,)))\n",
    "\n",
    "# 4. 编译和训练模型\n",
    "model.compile(optimizer='sgd', loss='mean_squared_error')\n",
    "\n",
    "############################################################\n",
    "# 5. 训练模型\n",
    "# verbose=0:不输出训练过程\n",
    "# 这里我们通过history来获得训练过程中的历史数据\n",
    "# 该 history 为 keras.callbacks.History 类型对象\n",
    "history = model.fit(X, y, epochs=500,verbose=0)\n",
    "print(\"history 对象类型:\",type(history)) # 打印history的类型\n",
    "\n",
    "# 通过history.history可以获得训练过程中的历史数据的字典\n",
    "history_dict = history.history\n",
    "print(\"history_dict 中包含所有的键: \",history_dict.keys()) # 打印history的键\n",
    "\n",
    "# 直接获取所有的loss，并绘制出来\n",
    "plt.title(\"loss\",size=20)\n",
    "plt.plot(history_dict['loss'])\n",
    "plt.show()\n",
    "############################################################\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b51c1f73-4935-4435-b137-6ef35e462a41",
   "metadata": {},
   "source": [
    "### 练习"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "26bbc50a-6cd3-4cec-897e-cd732258a0fa",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple/\n",
      "Requirement already satisfied: pydot in /opt/conda/lib/python3.9/site-packages (1.4.2)\n",
      "Requirement already satisfied: pyparsing>=2.1.4 in /opt/conda/lib/python3.9/site-packages (from pydot) (2.4.7)\n"
     ]
    }
   ],
   "source": [
    "!pip install pydot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "31dc5974-8891-4ff2-a460-45a359971463",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Collecting package metadata (current_repodata.json): done\n",
      "Solving environment: failed with initial frozen solve. Retrying with flexible solve.\n",
      "Solving environment: failed with repodata from current_repodata.json, will retry with next repodata source.\n",
      "Collecting package metadata (repodata.json): done\n",
      "Solving environment: done\n",
      "\n",
      "\n",
      "==> WARNING: A newer version of conda exists. <==\n",
      "  current version: 4.10.3\n",
      "  latest version: 22.9.0\n",
      "\n",
      "Please update conda by running\n",
      "\n",
      "    $ conda update -n base conda\n",
      "\n",
      "\n",
      "\n",
      "## Package Plan ##\n",
      "\n",
      "  environment location: /opt/conda\n",
      "\n",
      "  added / updated specs:\n",
      "    - graphviz\n",
      "\n",
      "\n",
      "The following packages will be downloaded:\n",
      "\n",
      "    package                    |            build\n",
      "    ---------------------------|-----------------\n",
      "    atk-1.0-2.36.0             |       h3371d22_4         560 KB  conda-forge\n",
      "    cairo-1.16.0               |    h6cf1ce9_1008         1.5 MB  conda-forge\n",
      "    expat-2.4.8                |       h27087fc_0         187 KB  conda-forge\n",
      "    font-ttf-dejavu-sans-mono-2.37|       hab24e00_0         388 KB  conda-forge\n",
      "    font-ttf-inconsolata-3.000 |       h77eed37_0          94 KB  conda-forge\n",
      "    font-ttf-source-code-pro-2.038|       h77eed37_0         684 KB  conda-forge\n",
      "    font-ttf-ubuntu-0.83       |       hab24e00_0         1.9 MB  conda-forge\n",
      "    fontconfig-2.14.0          |       h8e229c2_0         305 KB  conda-forge\n",
      "    fonts-conda-ecosystem-1    |                0           4 KB  conda-forge\n",
      "    fonts-conda-forge-1        |                0           4 KB  conda-forge\n",
      "    fribidi-1.0.10             |       h36c2ea0_0         112 KB  conda-forge\n",
      "    gdk-pixbuf-2.42.6          |       h04a7f16_0         609 KB  conda-forge\n",
      "    gettext-0.19.8.1           |    h73d1719_1008         3.6 MB  conda-forge\n",
      "    graphite2-1.3.13           |    h58526e2_1001         102 KB  conda-forge\n",
      "    graphviz-2.50.0            |       h85b4f2f_1         2.9 MB  conda-forge\n",
      "    gtk2-2.24.33               |       h539f30e_1         7.3 MB  conda-forge\n",
      "    gts-0.7.6                  |       h64030ff_2         411 KB  conda-forge\n",
      "    harfbuzz-3.1.1             |       h83ec7ef_0         2.1 MB  conda-forge\n",
      "    libgd-2.3.3                |       h6ad9fb6_0         279 KB  conda-forge\n",
      "    libglib-2.70.2             |       h174f98d_4         3.1 MB  conda-forge\n",
      "    librsvg-2.52.5             |       hc3c00ef_1         5.4 MB  conda-forge\n",
      "    libtool-2.4.6              |    h9c3ff4c_1008         511 KB  conda-forge\n",
      "    libuuid-2.32.1             |    h7f98852_1000          28 KB  conda-forge\n",
      "    libwebp-1.2.1              |       h3452ae3_0          84 KB  conda-forge\n",
      "    libxcb-1.13                |    h7f98852_1004         391 KB  conda-forge\n",
      "    openssl-1.1.1o             |       h166bdaf_0         2.1 MB  conda-forge\n",
      "    pango-1.48.10              |       h54213e6_2         403 KB  conda-forge\n",
      "    pcre-8.45                  |       h9c3ff4c_0         253 KB  conda-forge\n",
      "    pixman-0.40.0              |       h36c2ea0_0         627 KB  conda-forge\n",
      "    pthread-stubs-0.4          |    h36c2ea0_1001           5 KB  conda-forge\n",
      "    xorg-kbproto-1.0.7         |    h7f98852_1002          27 KB  conda-forge\n",
      "    xorg-libice-1.0.10         |       h7f98852_0          58 KB  conda-forge\n",
      "    xorg-libsm-1.2.3           |    hd9c2040_1000          26 KB  conda-forge\n",
      "    xorg-libx11-1.7.2          |       h7f98852_0         941 KB  conda-forge\n",
      "    xorg-libxau-1.0.9          |       h7f98852_0          13 KB  conda-forge\n",
      "    xorg-libxdmcp-1.1.3        |       h7f98852_0          19 KB  conda-forge\n",
      "    xorg-libxext-1.3.4         |       h7f98852_1          54 KB  conda-forge\n",
      "    xorg-libxrender-0.9.10     |    h7f98852_1003          32 KB  conda-forge\n",
      "    xorg-renderproto-0.11.1    |    h7f98852_1002           9 KB  conda-forge\n",
      "    xorg-xextproto-7.3.0       |    h7f98852_1002          28 KB  conda-forge\n",
      "    xorg-xproto-7.0.31         |    h7f98852_1007          73 KB  conda-forge\n",
      "    ------------------------------------------------------------\n",
      "                                           Total:        37.0 MB\n",
      "\n",
      "The following NEW packages will be INSTALLED:\n",
      "\n",
      "  atk-1.0            conda-forge/linux-64::atk-1.0-2.36.0-h3371d22_4\n",
      "  cairo              conda-forge/linux-64::cairo-1.16.0-h6cf1ce9_1008\n",
      "  expat              conda-forge/linux-64::expat-2.4.8-h27087fc_0\n",
      "  font-ttf-dejavu-s~ conda-forge/noarch::font-ttf-dejavu-sans-mono-2.37-hab24e00_0\n",
      "  font-ttf-inconsol~ conda-forge/noarch::font-ttf-inconsolata-3.000-h77eed37_0\n",
      "  font-ttf-source-c~ conda-forge/noarch::font-ttf-source-code-pro-2.038-h77eed37_0\n",
      "  font-ttf-ubuntu    conda-forge/noarch::font-ttf-ubuntu-0.83-hab24e00_0\n",
      "  fontconfig         conda-forge/linux-64::fontconfig-2.14.0-h8e229c2_0\n",
      "  fonts-conda-ecosy~ conda-forge/noarch::fonts-conda-ecosystem-1-0\n",
      "  fonts-conda-forge  conda-forge/noarch::fonts-conda-forge-1-0\n",
      "  fribidi            conda-forge/linux-64::fribidi-1.0.10-h36c2ea0_0\n",
      "  gdk-pixbuf         conda-forge/linux-64::gdk-pixbuf-2.42.6-h04a7f16_0\n",
      "  gettext            conda-forge/linux-64::gettext-0.19.8.1-h73d1719_1008\n",
      "  graphite2          conda-forge/linux-64::graphite2-1.3.13-h58526e2_1001\n",
      "  graphviz           conda-forge/linux-64::graphviz-2.50.0-h85b4f2f_1\n",
      "  gtk2               conda-forge/linux-64::gtk2-2.24.33-h539f30e_1\n",
      "  gts                conda-forge/linux-64::gts-0.7.6-h64030ff_2\n",
      "  harfbuzz           conda-forge/linux-64::harfbuzz-3.1.1-h83ec7ef_0\n",
      "  libgd              conda-forge/linux-64::libgd-2.3.3-h6ad9fb6_0\n",
      "  libglib            conda-forge/linux-64::libglib-2.70.2-h174f98d_4\n",
      "  librsvg            conda-forge/linux-64::librsvg-2.52.5-hc3c00ef_1\n",
      "  libtool            conda-forge/linux-64::libtool-2.4.6-h9c3ff4c_1008\n",
      "  libuuid            conda-forge/linux-64::libuuid-2.32.1-h7f98852_1000\n",
      "  libwebp            conda-forge/linux-64::libwebp-1.2.1-h3452ae3_0\n",
      "  libxcb             conda-forge/linux-64::libxcb-1.13-h7f98852_1004\n",
      "  pango              conda-forge/linux-64::pango-1.48.10-h54213e6_2\n",
      "  pcre               conda-forge/linux-64::pcre-8.45-h9c3ff4c_0\n",
      "  pixman             conda-forge/linux-64::pixman-0.40.0-h36c2ea0_0\n",
      "  pthread-stubs      conda-forge/linux-64::pthread-stubs-0.4-h36c2ea0_1001\n",
      "  xorg-kbproto       conda-forge/linux-64::xorg-kbproto-1.0.7-h7f98852_1002\n",
      "  xorg-libice        conda-forge/linux-64::xorg-libice-1.0.10-h7f98852_0\n",
      "  xorg-libsm         conda-forge/linux-64::xorg-libsm-1.2.3-hd9c2040_1000\n",
      "  xorg-libx11        conda-forge/linux-64::xorg-libx11-1.7.2-h7f98852_0\n",
      "  xorg-libxau        conda-forge/linux-64::xorg-libxau-1.0.9-h7f98852_0\n",
      "  xorg-libxdmcp      conda-forge/linux-64::xorg-libxdmcp-1.1.3-h7f98852_0\n",
      "  xorg-libxext       conda-forge/linux-64::xorg-libxext-1.3.4-h7f98852_1\n",
      "  xorg-libxrender    conda-forge/linux-64::xorg-libxrender-0.9.10-h7f98852_1003\n",
      "  xorg-renderproto   conda-forge/linux-64::xorg-renderproto-0.11.1-h7f98852_1002\n",
      "  xorg-xextproto     conda-forge/linux-64::xorg-xextproto-7.3.0-h7f98852_1002\n",
      "  xorg-xproto        conda-forge/linux-64::xorg-xproto-7.0.31-h7f98852_1007\n",
      "\n",
      "The following packages will be UPDATED:\n",
      "\n",
      "  openssl                                 1.1.1l-h7f98852_0 --> 1.1.1o-h166bdaf_0\n",
      "\n",
      "\n",
      "\n",
      "Downloading and Extracting Packages\n",
      "xorg-libxau-1.0.9    | 13 KB     | ##################################### | 100% \n",
      "xorg-libxdmcp-1.1.3  | 19 KB     | ##################################### | 100% \n",
      "font-ttf-inconsolata | 94 KB     | ##################################### | 100% \n",
      "pixman-0.40.0        | 627 KB    | ##################################### | 100% \n",
      "fonts-conda-ecosyste | 4 KB      | ##################################### | 100% \n",
      "font-ttf-ubuntu-0.83 | 1.9 MB    | ##################################### | 100% \n",
      "fontconfig-2.14.0    | 305 KB    | ##################################### | 100% \n",
      "xorg-renderproto-0.1 | 9 KB      | ##################################### | 100% \n",
      "xorg-xextproto-7.3.0 | 28 KB     | ##################################### | 100% \n",
      "xorg-libxrender-0.9. | 32 KB     | ##################################### | 100% \n",
      "libglib-2.70.2       | 3.1 MB    | ##################################### | 100% \n",
      "gts-0.7.6            | 411 KB    | ##################################### | 100% \n",
      "font-ttf-dejavu-sans | 388 KB    | ##################################### | 100% \n",
      "xorg-libxext-1.3.4   | 54 KB     | ##################################### | 100% \n",
      "gettext-0.19.8.1     | 3.6 MB    | ##################################### | 100% \n",
      "cairo-1.16.0         | 1.5 MB    | ##################################### | 100% \n",
      "libxcb-1.13          | 391 KB    | ##################################### | 100% \n",
      "expat-2.4.8          | 187 KB    | ##################################### | 100% \n",
      "graphviz-2.50.0      | 2.9 MB    | ##################################### | 100% \n",
      "pcre-8.45            | 253 KB    | ##################################### | 100% \n",
      "libuuid-2.32.1       | 28 KB     | ##################################### | 100% \n",
      "librsvg-2.52.5       | 5.4 MB    | ##################################### | 100% \n",
      "font-ttf-source-code | 684 KB    | ##################################### | 100% \n",
      "xorg-libsm-1.2.3     | 26 KB     | ##################################### | 100% \n",
      "harfbuzz-3.1.1       | 2.1 MB    | ##################################### | 100% \n",
      "gdk-pixbuf-2.42.6    | 609 KB    | ##################################### | 100% \n",
      "pthread-stubs-0.4    | 5 KB      | ##################################### | 100% \n",
      "fribidi-1.0.10       | 112 KB    | ##################################### | 100% \n",
      "xorg-libx11-1.7.2    | 941 KB    | ##################################### | 100% \n",
      "libwebp-1.2.1        | 84 KB     | ##################################### | 100% \n",
      "xorg-xproto-7.0.31   | 73 KB     | ##################################### | 100% \n",
      "fonts-conda-forge-1  | 4 KB      | ##################################### | 100% \n",
      "libtool-2.4.6        | 511 KB    | ##################################### | 100% \n",
      "atk-1.0-2.36.0       | 560 KB    | ##################################### | 100% \n",
      "openssl-1.1.1o       | 2.1 MB    | ##################################### | 100% \n",
      "xorg-libice-1.0.10   | 58 KB     | ##################################### | 100% \n",
      "pango-1.48.10        | 403 KB    | ##################################### | 100% \n",
      "libgd-2.3.3          | 279 KB    | ##################################### | 100% \n",
      "gtk2-2.24.33         | 7.3 MB    | ##################################### | 100% \n",
      "graphite2-1.3.13     | 102 KB    | ##################################### | 100% \n",
      "xorg-kbproto-1.0.7   | 27 KB     | ##################################### | 100% \n",
      "Preparing transaction: done\n",
      "Verifying transaction: done\n",
      "Executing transaction: - \n",
      "| \n",
      "done\n",
      "\n",
      "Note: you may need to restart the kernel to use updated packages.\n"
     ]
    }
   ],
   "source": [
    "conda install graphviz -y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "6d52e38d-4015-43d7-b7e4-d7d2fd5b6fcb",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_7\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "dense_14 (Dense)             (None, 2)                 4         \n",
      "_________________________________________________________________\n",
      "dense_15 (Dense)             (None, 1)                 3         \n",
      "=================================================================\n",
      "Total params: 7\n",
      "Trainable params: 7\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    },
    {
     "data": {
      "image/png": "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Y6hcuTKTJ0/miy++ICkpiUcffZTU1FTGjRvHr7/+yurVq5k8eTJDhgyhadOmTJkyhd27dzNgwABat25d2pfLb9asWaxdu5Ynn3ySuLi4fEE0+Fps+/fvz5YtW/j222/56quvqFKlCuXLlz9mX9ZaduzYwaxZs/jll19ITk4mJiaG9u3b07dvXyIiIpg5cyaTJk0iIiKCv//973z99desXbuWqKgohg4dSpcuXbDW4vV6mTBhAnPmzOHw4cMkJCRw00030aVLl2PqWJiwsDBq1aoFQHBw8HG3LV++PPXq1ePXX39lwYIFtGjR4qSOI6fOGKMWaRERkSOoRVpEzpiAgABq1KjBpZdeyrx589i5cydOp5OmTZsSGRnJ3LlzycjI4Morr2TgwIFs3LiRxx57DI/HQ/PmzXE6nXz33XfUrl2b22+/nd69e/PHH3/w4IMPkpiYSLt27XA6nSxevJiMjAzA11pbq1Yt1qxZw969e2nYsCE1atQgJiaGq6++mr///e80btyY9PR01qxZw/Lly9m/f38pX6n8vvnmGyIiIkhISCAwMLDAMgkJCdxyyy3UqFGDadOm8dNPP+F2u48pt2XLFt5++21mzZpFy5YtufXWW2nYsCHTpk3j+eefJycnh0aNGhEYGMiPP/6Iy+Xiqquuon///v5g3u12Y61l/Pjx/N///R8NGzZk8ODBWGv517/+xfr16/N1zS4uTqeTypUrExAQwJ9//smBAweK/RhSMAMojhYREfkftUiLyBnjdDopX748rVq18i9zOBxUq1aNatWqYa2lUaNGlCtXDo/Hw++//87LL79MUlIS1atX94/x7dixIzExMaSnpxMQEMB9993H119/zeDBg0lISMjXNbhWrVrUq1eP0NBQAKpUqULVqlWJjo6mRYsWdOvWDYDU1FTuuusu0tPTqVu37hm8KoXLzs5m7dq1lC9fnpCQkOO2wDocDi666CJ69erFu+++y/Tp06lVq1a+7vMej4eVK1cyd+5cOnTowMCBA4mOjmbHjh1kZmYyefJkrrjiCjp27EiVKlVwOBw0btyY+Ph4MjMz+eOPP3jzzTfZt28fMTExvP7668THxzNo0CDKlStHzZo1ad++PTNnzmT48OEl0lpctmxZYmJi2LNnD7t27aJs2bLFfgw5ljFGgbSIiMgR1CItImeVMmXKEBgYSHBwMNWr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g9WrV7Nu3TqstaSmpvrrGhgYyK233orL5eKXX36hW7dugC+QDw4OZsiQIf7PX2JiYr7PX2Zmpn886OHDh/3dykXk7GaMSQD+CbS21jYGnMANZ7IODg2RFhERyee8aJEGuPfeewkNDeXTTz9l1qxZJCQkcNFFF1GrVi0+//xzKlSowODBg3n88cd55513ePDBB8nMzKRatWpcd911dOnShVmzZjFv3jwA7rzzTp566im++eYbxo0bh9vt5v777+exxx7D6/XSr18/0tLSqFChAnfccQdDhgwBYOTIkYSHh/P+++8zcuRIYmJi6NChA48++iiVKlUq0rmsW7eOV199lSVLlrB7925ycnK47777qFy5MjfddBPXX389FSpUOGa74ODgQseJHy09PZ13332XN954g+DgYEaPHs2yZcvo1KkTkyZNIjIykmuuuYZp06bx008/8corrxAdHc3QoUOZPn064Et81rt3b/bv309ISAgdOnTgiSeeoFKlShhj6Nu3L0uXLmX8+PFMnDiRjh07UqFCBWJiYhgzZgwxMTG0bt2aTp06MXnyZObMmcPf//53OnbsSGhoaKHnk56ezrfffstzzz3Hli1bMMbQs2dPBg4cSEBAANOmTSMwMNDfgjtv3jxGjRpFdHQ0Q4YMYebMmYBvbHGPHj3Yt28foaGhXHzxxTzzzDNER0djjOHmm2/mt99+45VXXuGdd96hS5cuxMbGEhMTw1NPPUVkZCRdu3Zl8eLFjBkzhsmTJ9OtWze2bdvGvHnzyM7O5j//+Q//+c9/jjmH1q1bU758eRo1akT37t15/fXXGTduHJ07d6ZDhw789ttv3HHHHUyYMMHfXb5Vq1a0aNGCHj16+BPh5Rk5ciQRERF88MEHvPjii8TExNC+fXseeeQRpk+fzscff0xISAh9+/blX//6FzfccEO+6clE5KwVAIQaY1xAGLDrjB7dGHTfTURE5H/M2dAi1bp1a7t06VL/66lTp3LTTTeRkpKSLymYnF3uuusupk6dSmJiImFhYaVdnZNmreXOO+9k6tSp7Nu376zt+pz3bzSv+3hGRgY333wzY8aM8c/Hfaa89957zJkzhxtuuIHrr7/+jB77XOJyufj0008ZNmyYv2eEnH1cLheTJk3ib3/7W4HvkzFmmbW2dSlU7RjGmHuBF4BMYK619uYCygwDhgFUrVq1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Aeq5Ii+AltKT159AycZERER8NEZaRERECuXv2l261RARETlrKJAWERGRQvmTjalFWkREBFAgLSIiIieg6a9ERETyO6vHSP/8888aFydyFlm/fj379u1jzZo1lClTprSrc9Zyu92sXbsWr9fLvHnzSrs6chxut5u//vqrtKtxTjBKNiYiIpLPWR1IP/zwwzgcajQXOVscOHCAlJQUtm3bxsyZM0u7Omctay2HDh3C7XbzwAMPlHZ15Djy3ic5MYd/jLQiaREREThLA+n27dszZcoUjcUSOQm//PILo0eP5rPPPivtqoicU3TD9sTyko159bUsIiICnKWBdOXKlalcuXJpV0PknGGtxeVyAdC7d29/N0wRkeJgULIxERGRI+k2vIiIiBRK01+JiIjkp0BaRERECqXpr0RERPJTIC0iIiKF8icbUxwtIiICKJAWERGRE8gbI61kYyIiIj4KpEVERKRQRtNfiYiI5KNAWkRERAqlrt0iIiL5KZAWERGRE8jr2q1IWkREBBRIi4iIyAkYtUiLiIjko0BaRERECuXIi6RFREQEUCAtIiIiJ5AXRqtrt4iIiI8CaRERESmUI/fXguJoERERHwXSIiIiUiijZGMiIiL5KJAWERGRwvnnkRYRERFQIC0iIiInkJdsTA3SIiIiPgqkRUREpFB5ycasImkRERFAgbSIiIicgFHXbhERkXwUSIuIiEih1LVbREQkPwXSIiIiUijNIy0iIpKfAmkREREpXF7XbsXRIiIigAJpEREROQF/126NkhYREQEUSIuIiMgJ/C9rd6lWQ0RE5KyhQFpEREQK5XAo2ZiIiMiRFEiLiIhIoZRsTEREJD8F0iIiIlIozSMtIiKSnwJpERERKZTxzyOtUFpERAQUSIuIiMgJKNmYiIhIfgqkRUREpFBG01+JiIjko0BaRERECuXIGyOtOFpERARQIC0iIiInYHI7d3sVSIuIiABFCKSNMeONMUnGmNVHLIszxnxrjNmQ+xx7xLpHjTEbjTHrjDFXlFTFRURE5MzwZ+1Wk7SIiAhQtBbpD4Arj1r2CPC9tbYO8H3ua4wxDYEbgEa52/zXGOMsttqKiIhcgIwxMcaYacaYtcaYv4wx7c/s8X3PapEWERHxOWEgba39GTh41OKewIe5f38I9Dpi+SRrbba1dguwEWhbPFUVERG5YI0BvrHW1gea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N2utJTs7m3vvvZfatWtz8803U6lSpdPaZ1ZWFt999x0PPPAAzz77LDfccMNJ1cfhcPinMDvbr9/JMMYss9a2Lu16nIqS+F6tPWI2wy6pyUNX1i/W/YqIiJytCvstoBbps1RGRgZZWVl4PB4iIiIIDg7G4Ti3euLn/eDPzs4mPDy80CmGrLVkZmbidrsJCQkpcmZir9dLdna2f1zu0RwOB06nk6CgIEJCQs65a3i28Hq95+XYyLJlyzJgwADeeecd5s2bR506dYiMjDyrg8GcnBzmzZtHcnIyF198MeXLlz+t/Xk8HjZt2sT06dPp2rUrffv2LaaayvnGYYy6douIiORSVHGWevPNN7nkkktISEjg3XffzTdG81zg8XhIS0tj/Pjx9OvXj40bNxZaPjMzk3//+9/cfvvtLFiwoMjHSU1NZeLEiVx88cVUqFCBChUqULduXerWrUvDhg1p06YNffv2ZfTo0f4xqVJ0eTdC8hJnZWRkFFtyq7NFly5dGDx4MJs2bWLKlCmkpaWVdpUKtXr1an766ScefPBBWrVqVaSpu47H6/Wybds2Jk2aRGhoKC+//HKR5tSWC5RBXbtFRERyKZA+S+XNU1u//rnXhc7j8bBhwwYGDRrEQw89xLZt2wpsLc7j9Xr58ssv+eKLLzh06NBJHSs6OpqhQ4fy1VdfUbVqVerVq8fBgwfZv38/69at47333qNGjRqMHDmSDh068Ouvv56XLaslZcaMGXz88cds376dF198kWeffdafqfp8cvnll/Pggw/icDhYuHBhaVenUK1ateLFF1+kbdu2pz2n9P79+1myZAkNGzbk9ddfJzIysphqKecjA8o2JiIikktND1Ls1q9fz2uvvcZVV13FoUOHCp3WyFrL+vXrWblyJcnJyf4syKfDGIPT6SQuLo6uXbvSuXNnunXrxi233EK/fv1Ys2aNf85fKdwNN9xwUuNlz2W1atW64JJslStXzp/TQeRE1LVbRETkf9QifZaw1uLxeMjJyfF3p82bP7awMkfOx+tyucjOziYnJwe32+0vl5OT428RLmgfOTk5WGv9D7fbnW/dyXblbdCgAW+//TZDhgyhTJkyhY43zcrKYurUqSQkJHDJJZccc03yzuN0uhM7nU769OnDwIEDSUpK4p133in0XPOu0ZHdmvOu7dHvy5HX/cjyefs/etu890tE5FxjDHi9CqVFRERAgfRZw+v1Mm7cODp37kz58uWpUKECQ4YMyTe22OPxMGPGDK655hoqV65M3bp1uffee1mxYgWrVq1iyJAhxMXFcc011/Cf//yHLl26kJCQwOWXX87cuXOx1pKens60adNo164d8fHxJCQk0LVrV1JTUwHfWOUnnniCevXqUbZsWdq0acPkyZNLpDu0tZZp06YRHR1Nu3btCA0Nzbc+MTGRhx56iEsvvZRZs2ad1rEcDgcDBw7EWsucOXMAcLlcPP3009SrV48yZcrQunVrPvnkEzweD+PHj6dSpUrExsbyySefcNNNN1GtWjVq1qzJ2LFjSU5OxlrL77//zsCBA6levTrly5enUaNGTJ8+HZfLhcfj4euvv6ZXr15UqVKFWrVqcccdd7B06VJ1LxeRc45apEVERP5HgfRZwFrLq6++yogRI+jUqRPLli1jx44djBkzhurVq/vLTZ48mRdeeIE6derwww8/MHbsWNasWcOYMWOIjY3l7rvv5tJLL8VaS+fOnZk9ezaTJk0iLS2Nl156iZycHNauXcsjjzzCsGHD2LNnD7/++iu1a9fG5XKRk5PDiBEjGDt2LKNHjyYxMZEePXowcODAYg/+rLWsXbuWP//8k4YNG1KnTp0CywDFkkHZGEOzZs0A2Lx5MwCPPvoor7zyCqNGjWL79u307NmTwYMHs2jRIgYPHsy9996L1+slIiKCt956i1WrVtGhQweef/55EhMTycjI4KGHHqJMmTLMmzePTZs2MWjQIMLCwvB6vcyaNYvnn3+esmXL8s033zB+/Hh27tzJv//9b7Zu3Xra5yQiciYZlGxMREQkj8ZInwWysrIYN24cDRo04M4776RGjRoAxMTEEBgYCPimvJk7dy5hYWH07t2bJk2aUL9+fZYtW8bXX3/N4sWLqVKlCuCb0qdRo0YEBQVRr149OnfuzLx589i2bRs7duzA5XJRp04dQkNDqV27Nh988AHWWg4cOMC4cePo3bs3ffr0wVrLiBEjGDVqFO+//z6tWxffdKo5OTmMGzeOli1b0r59+wKD9Bo1ajB69OhiO2ZERATGGNLS0sjKyuLNN9/0n6sxhhEjRvDqq68yYcIE2rRp49+uTZs2xMXFYYyhZ8+ezJ8/n507dxIUFMTBgwepXLkysbGxxMXFMWLECIwxuFwu5s2bh9frpXfv3rRs2RKXy8WaNWv44IMPWLBggf99Liq1Yp9Y3jXK61ovJU/X+QJiQG+3iIiIjwLps8DWrVtJTU3lmmuuISIiosAyu3btYt++fZQvX564uDistQQEBBATE0NOTg579+71B9JHcjgcBAQEYK3F6XRSvXp1cnJyGDx4MHfffTc33HADVapUwev1sn79erKysmjYsKH/x3FoaCgVKlRg3bp1xXa+1lomTJhAxYoVadu2LeHh4WdkyqH09HSstURGRrJu3ToyMzNp1KiRv04hISFUqFCB9evXH3ccc2BgIMYY3G43lSpVomLFirz88susX7+eQYMG0apVK8LCwtizZw9JSUmULVuW+Ph4//sVHR2NtZbdu3efVN2zsrKYMmXKaV+D811WVhbLly8nIiKCkJCQ0q6OyHnFcRbPry4iInKmnTCQNsaMB3oASdbaxrnLngb+BuzLLTbCWjs7d92jwBDAA/zTWjunBOp9XtmzZw9ut5u4uLjjzuGal+RqxowZzJgxI9+6SpUq4XK5TngcYwz169dnypQpPPfcc4wYMYKnn36am266iVdffZWMjAzcbjcjRoxgxIgR+batWLHiqZ/gUdasWcPy5cu54YYbqFWr1jEtWke2JhZHt+68fW7YsAGA+vXrk56eDsATTzzBE088ka9sUTN6BwcH85///IfXXnuNKVOm8OGHH9K+fXueffZZKleujMvl4uuvv+brr7/Ot125cuXIyck5qfqnpKRcMNmzT9f48eMZP358aVdD5LxjNI+0iIiIX1HGSH8AXFnA8lettc1zH3lBdEPgBqBR7jb/NcY4i6uy56vg4GCMMfmyax8tKiqKkJAQbrjhBlasWOHP1O31etmxYwf33ntvkY/VuXNn5s6dy7p16xgyZAiffvopb7zxBmXLliUwMJAxY8bk27/X62XhwoXFFtR+8803fPnll3Tu3BmHw4HD4SAyMpK33nqLefPmcfnllzNo0CC2b99eLMcDXzK3OXPmYIzhqquuIj4+HoDRo0cfc66//fZbkVsza9SowZgxY1i7di1vv/02Bw4c4M0332TLli2EhobSs2dPFi1alG//e/bs4bHHHjup+pcrV+6Yeupx7KNSpUr85z//ISUlpdTrciE95MJgUNduERGRPCdskbbW/myMqV7E/fUEJllrs4EtxpiNQFvg11Ov4vmvXr16hISEsGTJ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drtLu9pyljIGde0WERHJpUBaRI7r559/ZvHixUWap/xkZWVlMXXqVDZu3Fjs+y6q/fv3M3nyZAA6d+5MREREvqzTFSpU4Nprr6Vdu3b89NNPTJgwobSqekr69OnDjTfeSHBwMA6Hg4CAAKKiooiKiiIrK4vMzEycTie1atWid+/efP/990ybNq20qy1nKWNQi7SIiEguBdIi5yFrLePGjaNbt27Uq1ePZs2aMXToUP788088Hg8vv/wyzZo1o3Xr1v6x7//973/p2LEjtWvXZu7cuXzwwQc88cQTfP/99wwbNozWrVvz8MMPc+utt9K0aVMGDBjAzTffTPPmzWnfvj3PPvssW7duZe3atQwbNoyGDRsybNgwAHbv3s19991HgwYN6NixI9u3b+fZZ5/lmWeeYc2aNdSqVYvu3bvj9Xr58ccfadq0KW+88UaJX6cFCxawbNky6tSpQ/369Y+ZusnhcNC8eXMGDRpEVlYWEydOZOXKlQXuy1pLRkYG//3vf7nsssuoV68eLVq04M4772TTpk1Ya5kwYQINGzakQYMGfPvttwwaNIgmTZrQvn17ZsyY4Z9ezePx8N///peuXbvSsGFDunXrxsSJE0lNTT2p88trWT/yvLKyskhPTycyMpKyZcsCEBwcTI0aNShbtiwff/zxcedtl9JljHEaY343xnxZKsfH6LMhIiKSS4G0yHlo7NixPPXUU1xzzTVMnDiRF198kbVr13LLLbewfft2brvtNpo1a0ZSUpK/K++AAQPo27cvWVlZZGRkcPXVV3PppZdSvXp1nnrqKSZNmsT9999P586dCQgIICYmhgcffJC3336bq6++mhkzZvDyyy8TExPDgAEDKFeunH/u67JlyzJs2DAuueQStm/fTkhICEOGDKFp06bUrFmT2bNn8/bbbwOQmprK1q1bOXjwYIlfpxUrVpCSkkKlSpUIDQ0tsExISAidOnVi0KBBrFq1itdff52srKxjyqWnp/P6668zatQoevfuzcSJE3n66adZvnw5AwYM4MCBA/To0YMuXbqwbt06AB5++GHee+89jDH861//IjMzE2stY8eO5eWXX+bqq69m3LhxtGnThmeffZaff/6ZzMzMUz5ft9vNzp07ycjIoHPnzgQHBwO+sa8RERHUrFmT9evXs2nTplM+hpSoe4G/SuvgDoM6douIiOQ6+wb1icgps9aSnZ3Nq6++StOmTbn11luJjo7G5XLh8Xi46aabmDp1Kv/4xz+IiorK11JZpkwZypYt6x/rGxMTQ3R0NCEhIVSqVInatWsD5FvWpEkTjDGUKVOGAwcO+Ft4K1eunC97e2BgIOXKlSM2Nhbwjd0tW7Ys4eHhBAcHU69ePX/9u3Tpwm+//eZvLS0pOTk57Ny5059I7+jW6COVL1+e6667jqVLl/Ljjz/yySef0LdvX/96ay0HDx7kvffeo1WrVtxyyy1ERkbSoEEDXC4XN910E5MnT+auu+4iNjYWay0tW7YkJiYGay3XXXcdTzzxBLt376ZKlSq8/fbb1K1bl/79+1OpUiWqVKnCtGnT+OKLL2jZsuVxg/4TWbt2LfPnz6dFixYMGDAg3zmHhIRQtWpVfvjhB9avX+9/v+XsYIypDFyDb1aMB0qpDsraLSIikkst0iLnmY0bN7J9+3YuuugiYmJicDqdhISE0LVrVwIDA1m4cCEul+u0jxMQEEBgYCABAQFUq1aNJk2akJqayubNm095n8YYoqKiaNiwIeXKlTvtOhYmNTWVtLQ0AgMD/S2zxxMQEECjRo0YMmQILpeL999/39+qDOByudi0aRNJSUm0adPGf93DwsK4/PLLAd9UVEcKCwvzj1suW7Ys1loyMzPZunUru3btonHjxsTFxREQEEClSpWIj49nw4YNp9wivWPHDr788kustdx3332UL18+33qn00lERAQul4ukpKRTOoaUqNeAhwDv8QoYY4YZY5YaY5bu27ev2CvgGyOtSFpERAQUSIucd/bt24fH4zmmRTc8PJyoqCgOHDiA13vc3+KnJDAwkNDQUDweD8nJycW675KSk5OD2+0mICCgSPMnh4aG0qFDB2677TZWr17NmDFj/DckvF4vBw4cwFpLXFycfxtjDGFhYURGRlJYYJPXMmyt5fDhw3g8HiZPnszll19Ohw4duPjii1m9ejWHDh3yj6M+GYmJiUydOpWUlBTuuusuGjZsiMOR/79/h8NBcHCwf6y3nD2MMT2AJGvtssLKWWvfsda2tta2jo+PL/56oGRjIiIiedS1W+Q8ExISAkB2dvYx67KysoiNjT0miDpdXq+XnJwcvF7vWTmfckGcTudJXQdjDOXKlaNXr14sXryYb7/9lvT0dCpUqIAxxh+EFnTds7Oz8wXYhYmIiADgyiuvpG/fvvlayyMiIkhISChyncHXnTuvJfq2226jZs2aBAYGHlPOWuu/wXI2TuV1gesIXGeMuRoIAaKMMR9ba285k5Uwxmj6KxERkVz6tSRynqlduzahoaGsXbs23/L169eTkZFB/fr1/UGk1+stlq6aBw4cIDExkcjISKpXrw74fnSfSuvpmZI3B3ROTk6Ru7oHBARQv359hg0bxj//+U9+++03evXqRUBAADVq1CAwMJANGzb4y3u9XtatW0dWVhaNGjUq0jEqVqzon66qY8eOREZGntL5WWtZvnw53377LXFxcXTr1o2qVaset/Xd6/WSkZFBQECAfyy7nB2stY8CjwIYY7oA/zrTQTTkJhtTHC0iIgKoa7fIecUYQ1xcHH369GHOnDnMmzeP9PR0EhMTefnllwkJCaF3794EBwdToUIFMjIyWL58OWlpaaSmprJ///58QWVISAhZWVns37+fw4cP+1ud81pes7KySE5O5ocffuD777+nYcOGtGvXjpCQEKKjo9mzZw+rVq0iJyeHw4cPc+DAAf++HQ4HYWFhHDx4kKSkJDIzM3G5XCxZsoQbb7yRqVOnlui1Cg0NpUyZMrjdbtLT04u8XVhYGB07duT222/3d4F2OBxUrFiR7t27M2fOHObPn096ejqbN2/2ZzLv169fkfYfGRnJZZddxo8//sjs2bP93bkPHTrEwYMHcbvdfPzxx9x555189913x+2GnZyczJdffsk777zDu+++y7333kufPn3o2bMnPXv25J577mHhwoX+8i6XiwMHDhAUFOS/GSJyJIPBq0haREQEUIu0yHnH6XTyyCOP4HQ6ef311wkMDMTr9ZKWlsaTTz5JkyZNcDqdXHXVVXzzzTeMGTOGr7/+mkaNGrFv3z7/HNTly5enadOmVK1alQ8//JDly5fTt29fcnJy8Hg8zJ49m61bt5KZmUlGRgb16tXjxhtvpEKFCoSFhdG9e3f++usvHn74YRo0aEC1atX8AeFLL73E/fffzxVXXMFPP/3EnXfeSaNGjbj33nvZu3cvs2fPpnHjxiV6nRwOB3Xr1uX7779n//79eDwenE4nu3fv5rvvvuPjjz8mMTGRF198kR49enDZZZcBvpsVZcuWpV+/fqxevdq/LCoqigcffJCxY8cyatQoAgMD8Xg8ZGRkMHLkSOrWrcvcuXOZPXs2AMOH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\n",
      "text/plain": [
       "<Figure size 1008x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import tensorflow as tf\n",
    "from tensorflow.keras import Sequential\n",
    "from tensorflow.keras.layers import Dense\n",
    "import matplotlib.pyplot as plt\n",
    "from skimage import io\n",
    "\n",
    "# 1. 明确数据\n",
    "X = tf.constant([-1.0,  0.0, 1.0, 2.0, 3.0, 4.0])\n",
    "y = tf.constant([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0])\n",
    "\n",
    "# 2. 创建一个序贯模型\n",
    "model = Sequential() \n",
    "\n",
    "# 3. 在模型中添加一个全连接Dense层\n",
    "hidden_layer_1 = Dense(units=2, input_shape=(1,))\n",
    "hidden_layer_2 = Dense(units=1) #---------------------->注意input_shape的值\n",
    "model.add(hidden_layer_1)\n",
    "model.add(hidden_layer_2)\n",
    "# 或者直接写成 model.add(Dense(units=1, input_shape=(1,)))\n",
    "\n",
    "# 4. 使用\"随机梯度下降\"作为优化方法, \"均方误差\"作为损失函数编译模型\n",
    "model.compile(optimizer='sgd', loss='mean_squared_error')\n",
    "\n",
    "# 5. 用模型去拟合 X 和 y ,用梯度下降优化模型的循环要做500个回合\n",
    "# model.fit(X, y, epochs=500,verbose=0)\n",
    "\n",
    "# 6. 用训练好的模型去预测y\n",
    "# print(model.predict([10.0]))\n",
    "\n",
    "# 打印模型的结构(文字版)\n",
    "model.summary()\n",
    "\n",
    "fig,ax = plt.subplots(1,2,figsize=(14,5))\n",
    "\n",
    "# 打印模型的结构(图形版)\n",
    "from tensorflow.keras.utils import plot_model\n",
    "plot_model(model, to_file='model.png', show_shapes=True)\n",
    "img = io.imread('model.png')\n",
    "ax[0].imshow(img)\n",
    "ax[0].set_title(\"Model Summary\",size = 20)\n",
    "\n",
    "\n",
    "# verbose=0:不输出训练过程\n",
    "# 通过history来获得训练过程中的历史数据\n",
    "# 该 history 为 keras.callbacks.History 类型对象\n",
    "history = model.fit(X, y, epochs=500,verbose=0)\n",
    "# print(\"history 对象类型:\",type(history)) # 打印history的类型\n",
    "\n",
    "# 通过history.history可以获得训练过程中的历史数据的字典\n",
    "history_dict = history.history\n",
    "# print(\"history_dict 中包含所有的键: \",history_dict.keys()) # 打印history的键\n",
    "\n",
    "# 直接获取所有的loss，并绘制出来\n",
    "ax[1].plot(history_dict['loss'])\n",
    "plt.title(\"loss\",size=20)\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "82a25271-17cb-40af-8a53-768e62dc5486",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4d799e8d-e191-4db1-95c5-e53f09057c9f",
   "metadata": {},
   "outputs": [],
   "source": [
    "import tensorflow as tf\n",
    "from tensorflow.keras import Sequential\n",
    "from tensorflow.keras.layers import Dense\n",
    "import matplotlib.pyplot as plt\n",
    "from skimage import io\n",
    "\n",
    "# 1. 明确数据\n",
    "X = tf.constant([-1.0,  0.0, 1.0, 2.0, 3.0, 4.0])\n",
    "y = tf.constant([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0])\n",
    "\n",
    "# 2. 创建一个序贯模型\n",
    "model = Sequential() \n",
    "\n",
    "# 3. 在模型中添加一个全连接Dense层\n",
    "hidden_layer_1 = Dense(units=2, input_shape=(1,))\n",
    "hidden_layer_2 = Dense(units=1, input_shape=(1,))\n",
    "model.add(hidden_layer_1)\n",
    "model.add(hidden_layer_2)\n",
    "\n",
    "# 4. 使用\"随机梯度下降\"作为优化方法, \"均方误差\"作为损失函数编译模型\n",
    "model.compile(optimizer='sgd', loss='mean_squared_error')\n",
    "\n",
    "# 打印模型的结构(文字版)\n",
    "model.summary()\n",
    "\n",
    "fig,ax = plt.subplots(1,2,figsize=(14,5))\n",
    "\n",
    "# 打印模型的结构(图形版)\n",
    "from tensorflow.keras.utils import plot_model\n",
    "plot_model(model, to_file='model.png', show_shapes=True)\n",
    "img = io.imread('model.png')\n",
    "ax[0].imshow(img)\n",
    "ax[0].set_title(\"Model Summary\",size = 20)\n",
    "\n",
    "history = model.fit(X, y, epochs=500,verbose=0)\n",
    "\n",
    "# 通过history.history可以获得训练过程中的历史数据的字典\n",
    "history_dict = history.history\n",
    "\n",
    "# 直接获取所有的loss，并绘制出来\n",
    "ax[1].plot(history_dict['loss'])\n",
    "plt.title(\"loss\",size=20)\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "31be7105-165c-413b-ab49-9eb4f59f0cc5",
   "metadata": {},
   "source": [
    "#### 参考答案"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8cd1e6ec-313d-4e3a-b89b-d77eadd609f0",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
